Optional এবং Streams API Java 8-এ একটি নতুন ও শক্তিশালী বৈশিষ্ট্য হিসেবে পরিচিত হয়েছে, যা নাল চেকিং এবং ডেটা প্রসেসিংকে আরও কার্যকর এবং সহজ করে তোলে। Optional মূলত একটি ক্লাস যা একটি মানের উপস্থিতি বা অনুপস্থিতি নির্দেশ করে এবং এটি NullPointerException প্রতিরোধে সাহায্য করে। অন্যদিকে, Streams API ডেটাকে functional style এ প্রসেস করার জন্য ব্যবহৃত হয় এবং parallel processing সমর্থন করে।
Optional ক্লাস
Optional একটি কন্টেইনার অবজেক্ট যা একটি মান ধারণ করতে পারে বা ধারণ নাও করতে পারে (অর্থাৎ null)। এটি null মানগুলির কারণে NullPointerException প্রতিরোধ করার জন্য ডিজাইন করা হয়েছে।
Optional এর মূল বৈশিষ্ট্য:
- Value Presence Check:
Optionalএর মাধ্যমে আপনি মানের উপস্থিতি যাচাই করতে পারেন, যার ফলে আপনি null চেকিং সহজভাবে করতে পারবেন। - Avoid NullPointerException:
Optionalআপনাকে NullPointerException প্রতিরোধে সাহায্য করে, কারণ আপনি একটি Optional মানের উপস্থিতি যাচাই না করে সরাসরি কাজ করতে পারবেন না। - Functional Programming:
Optionalআপনার কোডে ফাংশনাল স্টাইলের প্রোগ্রামিং প্রচার করে, যেমনmap(),filter(),ifPresent()ইত্যাদি।
Optional এর সাধারণ মেথডসমূহ:
isPresent(): যাচাই করে যে Optional অবজেক্টে কোনো মান রয়েছে কি না।get(): Optional অবজেক্টের মান রিটার্ন করে। তবে, যদি মান না থাকে, তাহলে NoSuchElementException থ্রো করবে।orElse(): যদি মান থাকে তবে সেটি রিটার্ন করবে, আর যদি না থাকে তবে একটি ডিফল্ট মান রিটার্ন করবে।ifPresent(): মান উপস্থিত থাকলে একটি অপারেশন সম্পাদন করবে।
Streams API এবং Optional এর Integration
Streams API ডেটা প্রসেসিং এর জন্য একটি ফাংশনাল ইন্টারফেস প্রদান করে, যা collection এর উপাদানগুলোকে প্রসেস করতে সহজ এবং কার্যকরী করে তোলে। Optional এবং Streams API একসাথে ব্যবহৃত হলে, আপনি null চেকিং ছাড়াই ডেটা স্ট্রিমের উপর কাজ করতে পারবেন এবং আরও কার্যকরভাবে ফিল্টার, ম্যাপ, রিডুস অপারেশন করতে পারবেন।
Streams API Overview:
Streams API আপনাকে লিনিয়ার ডেটা প্রসেস করতে সহায়তা করে, যেখানে আপনি ফিল্টার, ম্যাপ, রিডুস, এবং আরো অনেক কাজ করতে পারেন, যা functional style এ করা সম্ভব।
Optional এবং Streams API এর সাথে Integration এর উদাহরণ
Example 1: Optional and Streams Integration
ধরা যাক, আপনার কাছে একটি List রয়েছে, যার মধ্যে কিছু Optional উপাদান থাকতে পারে, এবং আপনি শুধুমাত্র তাদেরই প্রসেস করতে চান যেগুলিতে মান রয়েছে।
import java.util.*;
import java.util.stream.*;
public class OptionalWithStreamsExample {
public static void main(String[] args) {
// একটি List তৈরি করা যেখানে Optional মান রয়েছে
List<Optional<String>> list = Arrays.asList(
Optional.of("Java"),
Optional.empty(),
Optional.of("Python"),
Optional.empty(),
Optional.of("JavaScript")
);
// Stream API ব্যবহার করে Optional উপাদান ফিল্টার করা, যেগুলির মান উপস্থিত রয়েছে
list.stream()
.filter(Optional::isPresent) // Only keep Optionals that are not empty
.map(Optional::get) // Get the value from Optional
.forEach(System.out::println); // Print the non-empty Optional values
}
}
Output:
Java
Python
JavaScript
ব্যাখ্যা:
filter(Optional::isPresent):Optionalএর মধ্যে মান present কি না তা যাচাই করে।map(Optional::get): Optional থেকে মান বের করে।forEach(System.out::println): উপস্থিত মানগুলিকে কনসোল আউটপুটে প্রিন্ট করে।
Example 2: Using Optional with Streams API's orElse()
এখানে আমরা দেখব কিভাবে Optional এবং Streams API ব্যবহার করে ডেটা প্রসেসিংয়ে orElse() মেথডটি ব্যবহার করা যায়।
import java.util.*;
import java.util.stream.*;
public class OptionalWithStreamsOrElseExample {
public static void main(String[] args) {
List<Optional<String>> list = Arrays.asList(
Optional.of("Java"),
Optional.empty(),
Optional.of("Python"),
Optional.empty(),
Optional.of("JavaScript")
);
// Optional ব্যবহার করে স্ট্রিমের উপাদানগুলি প্রসেস করা
List<String> result = list.stream()
.map(opt -> opt.orElse("Unknown")) // যদি Optional.empty হয়, তাহলে "Unknown" ব্যবহার হবে
.collect(Collectors.toList());
System.out.println(result);
}
}
Output:
[Java, Unknown, Python, Unknown, JavaScript]
ব্যাখ্যা:
orElse("Unknown"): এটিOptionalঅবজেক্টের মধ্যে মান না থাকলে "Unknown" প্রদান করে।
Example 3: Combining Optional and flatMap() with Streams
এখানে আমরা দেখব কিভাবে flatMap() ব্যবহার করে Optional এর সাথে Streams API একত্রে কাজ করে।
import java.util.*;
import java.util.stream.*;
public class OptionalFlatMapExample {
public static void main(String[] args) {
// List of Optional Strings
List<Optional<String>> list = Arrays.asList(
Optional.of("Java"),
Optional.empty(),
Optional.of("Python"),
Optional.of("JavaScript")
);
// `flatMap` ব্যবহার করে Optional থেকে String রিটার্ন করা
List<String> result = list.stream()
.flatMap(opt -> opt.map(Stream::of).orElseGet(Stream::empty)) // Convert Optional to Stream
.collect(Collectors.toList());
System.out.println(result);
}
}
Output:
[Java, Python, JavaScript]
ব্যাখ্যা:
flatMap()ব্যবহার করা হয়েছে যাতে Optional থেকে Stream তৈরি করা যায়। যদি Optional মান ধারণ করে, তবে Stream::of এর মাধ্যমে স্ট্রিম তৈরি করা হয়, আর যদি না থাকে তবে Stream::empty দিয়ে খালি স্ট্রিম রিটার্ন করা হয়।
- Optional এবং Streams API একসাথে ব্যবহার করলে আপনি null চেকিং ছাড়াই functional programming স্টাইলের মাধ্যমে ডেটা প্রসেসিং করতে পারবেন।
- Optional মূলত null মান প্রতিরোধে সহায়তা করে, এবং Streams API ডেটা প্রসেসিং সহজ এবং কার্যকরী করে তোলে।
flatMap(),map(), এবংorElse()এর মতো মেথডের মাধ্যমে Optional এবং Streams API একসাথে ব্যবহৃত হতে পারে, যা আরও উন্নত এবং নিরাপদ কোড লেখার সুযোগ তৈরি করে।
এই দুইয়ের শক্তিশালী একত্রিত ব্যবহার আপনাকে আরও সঠিক, পরিষ্কার এবং কর্মক্ষম Java কোড তৈরি করতে সহায়তা করবে।
Read more